#!/usr/bin/env python
# -*- coding: utf-8 -*-
# task_guess_21.py
# author:luoxiang


# ## 猜21点
# ### 需求：
# * 两个玩家，游戏开始先输入名字
# * 用字典保存每个玩家信息：名字，获胜次数
# * 电脑随机产生两个数，每个玩家轮流猜1个数，与电脑随机产生的两个数求和，最接近21点的获胜
# * 每轮结束显示玩家信息
# * 按 q 退出游戏


# 游戏开场信息

import time  # 导入时间标准库
import random  # 导入随机标准库

print('欢迎参加21点游戏'.center(36, '-'))
time.sleep(1)  # 调用延时功能，延时1秒
print('游戏规则:')
time.sleep(1)
print('* 游戏需要2名玩家')
time.sleep(1)
print('* 每位玩家输入名字')
time.sleep(1)
print('* 玩家轮流猜一个数')
time.sleep(1)
print('* 与电脑随机生成的两个数求和')
time.sleep(1)
print('* 最接近21点的获胜')
time.sleep(1)
print('* 每局结束显示玩家信息：姓名和对战情况')
time.sleep(1)


names_list = []  # 新建用户名列表
num = 0

game_dict = {}  # 新建玩家对战信息字典
score01 = 0  # 玩家1获胜数
score02 = 0  # 玩家2获胜数
dogfall = 0  # 平局数
game_numbers = 0  # 游戏局数
player01 = 0
player02 = 0

# 选择游戏进程
print('继续游戏，请输入:y；按其他任意键可退出 '.center(28, '-'))
time.sleep(1)
print('若中途需要退出游戏，请输入 q'.center(32, '-'))

choose = input('')

while choose == 'y':  # 开始用户名输入循环，外部大循环
    num += 1
    print(f'玩家{num}名字：')
    name = input('')
    if name == 'q':  # 判断玩家是否想退出
        print('退出游戏')
        break
    if name == '':  # 判断玩家输入姓名时候为空
        print('必须输入2名玩家，名字不能为空！')
        num = 0
        continue

    names_list.append(name)

    if len(names_list) < 2:  # 限制用户名列表用户名添加
        continue

    else:
        is_start = True
        while (is_start):  # 开始游戏对战循环

            # 每位玩家在整数0-10之间猜一个数，与PC随机生成的两个数求和
            # 玩家01三个游戏点数生成
            Num1 = random.randint(2, 9)
            num_list = [1, 10, 11]
            Num2 = random.choice(num_list)
            player01 = input(f'{names_list[0]}请输入0-10的整数 ：')

            if player01 == 'q':  # 退出内部游戏循环
                print('再输入一次q退出')
                break

            # 玩家02三个游戏点数生成
            Num3 = random.randint(2, 9)
            num_list = [1, 10, 11]
            Num4 = random.choice(num_list)
            player02 = input(f'{names_list[1]}请输入0-10的整数 ：')

            if player02 == 'q':  # 退出内部游戏循环
                print('再输入一次q退出')
                break

            if player01 == '' or player02 == '':
                print('不能为空！')
                continue

            if int(player01) not in range(0, 11)
            or int(player02) not in range(0, 11):
                print('数值无效!')
                continue

            # 两位玩家三个游戏点数求和
            sum01 = Num1 + Num2 + int(player01)
            sum02 = Num3 + Num4 + int(player02)

            # 比较判断两位玩家的总点数大小（6种情况）
            if sum01 > 21 and sum02 > 21:  # 按照21点游戏规则，爆牌，重新输入
                print(f'{names_list[0]}的点数{sum01}，{names_list[1]}的点数{sum02}')
                print('都爆牌了，请重新输入')
                continue

            if sum01 == sum02 <= 21:  # 平局不分胜负，重新输入
                dogfall += 1
                print(f'{names_list[0]}的点数{sum01}，{names_list[1]}的点数{sum02}')
                print('平局，请重新输入')
                continue

            if sum01 <= 21 and sum02 > 21:  # 玩家2爆牌，玩家1获胜
                score01 += 1
                print(f'{names_list[0]}的点数{sum01}，{names_list[1]}的点数{sum02}')

            if sum01 > 21 and sum02 <= 21:  # 玩家1爆牌，玩家2获胜
                score02 += 1
                print(f'{names_list[0]}的点数{sum01}，{names_list[1]}的点数{sum02}')

            if sum02 < sum01 <= 21:  # 不爆牌情况下，玩家1点数大，获胜
                score01 += 1
                print(f'{names_list[0]}的点数{sum01}，{names_list[1]}的点数{sum02}')

            if sum01 < sum02 <= 21:  # 不爆牌情况下，玩家2点数大，获胜
                score02 += 1
                print(f'{names_list[0]}的点数{sum01}，{names_list[1]}的点数{sum02}')

            game_numbers += 1  # 每局游戏局数 + 1
            fisrt_player = f'获胜{score01}局'
            second_player = f'获胜{score02}局'
            dogfalls = f'{dogfall}局'
            game_dict[names_list[0]] = fisrt_player  # 获胜情况存入对战信息字典
            game_dict[names_list[1]] = second_player  # 获胜情况存入对战信息字典
            game_dict['双方打平'] = dogfalls
            print(f'玩家对战,第{game_numbers}局'.center(40, '-'))
            time.sleep(1)
            print(game_dict)  # 打印输出玩家信息和对战情况
            time.sleep(1)

            # 判断是否继续游戏
            print('（y：继续下局，q: 退出游戏）')
            choose = input('')
            if choose == 'y':
                continue
            else:
                break

else:  # 游戏开始前按任意键退出游戏
    print('退出游戏')
